package primary.String;

import java.util.*;

/**
 * @Author Elephas
 * @Date 2022/1/8
 **/
public class FindFirstUniqChar {
    public static void main(String[] args) {
        final String TEST01 = "leetcode";
        int x = findFirstChar(TEST01);
        return;
    }

    /*
        解法一：利用Map,存储已扫描元素，如果后面元素在Set中，则就是索求索引
        因为用到了按顺序存储的特性，所以使用了LinkedHashMap而不是HashMap
     */

    public static int findFirstUniqChar(String s){
        Map<Character,Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char temp = s.charAt(i);
            if(map.containsKey(temp)){
                map.put(temp,map.get(temp)+1);
            }else{
                map.put(temp,1);
            }
        }
        char key = 0;
        for(Map.Entry<Character,Integer> entry: map.entrySet()){
            if(entry.getValue()==1){
                key=entry.getKey();
                break;
            }
        }
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i)==key){
                return i;
            }
        }
        return -1;
        // 未找到返回-1
    }

    /*
        解法1.2：解法一可以优化，不使用泛型，通过自实现哈希表减少开销
     */
    public static int findFirstChar(String s){
        int[] chars = new int[26];
        for (int i = 0; i < chars.length; i++) {
            chars[i]=0;
        }
        for (int i = 0; i < s.length(); i++) {
            chars[s.charAt(i)-'a']++;
        }

        for (int i = 0; i < s.length(); i++) {
            if(1==chars[s.charAt(i)-'a']){
                return i;
            }
        }
        return -1;
    }
}
